package com.eugenema.enumEntity;

import com.eugenema.handler.*;

import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

public enum StepAction {
    /** 设置值到全局 */
    DATA_SET("dataSet", "设置值到全局", DataActionHandler.class),
    /** 获取值 */
    DATA_ELEMENT_GET("dataElementSet", "获取元素列表，并设置到全局", DataActionHandler.class),
    /** 执行 JS，并将返回值存入全局 */
    DATA_JS_GET_SET("dataJsGetSet", "执行 JS，并将返回值存入全局", DataActionHandler.class),

    /** Web端打开网站链接操作 */
    OPEN_URL("openUrl", "打开网站链接操作", OpenUrlActionHandler.class),

    /** 模拟点击 Windows 系统键盘普通按键,例如：Home 键 */
    WINDOWS_KEY_SG("windowsKeySg", "模拟点击 Windows 系统键盘普通按键,例如：Home 键", WindowsSystemHandler.class),
    /** 模拟点击 Windows 系统键盘组合按键，例如：Ctrl+W */
    WINDOWS_KEY_CB("windowsKeyCb", "模拟点击 Windows 系统键盘组合按键,例如：Ctrl + W", WindowsSystemHandler.class),
    /** 模拟点击 Windows 系统键盘特殊组合按键,例如：Ctrl + Tab */
    WINDOWS_KEY_CB_SC("windowsKeyCbSc", "模拟点击 Windows 系统键盘特殊组合按键,例如：Ctrl + Tab", WindowsSystemHandler.class),
    /** 模拟点击 Windows 系统键盘多重特殊组合按键,例如：Ctrl + Shift + K */
    WINDOWS_KEY_CBS("windowsKeyCbs", "模拟点击 Windows 系统键盘多重特殊组合按键,例如：Ctrl + Shift + K", WindowsSystemHandler.class),
    /** 模拟操作切换浏览器到当前最新窗口 */
    WINDOWS_CUT_NEW("windowsCutNew", "模拟操作切换浏览器到当前最新窗口", WindowsSystemHandler.class),
    /** 根据索引，模拟操作切换浏览器到指定窗口 */
    WINDOWS_CUT_BY_INDEX("windowsCutByIndex", "根据索引，模拟操作切换浏览器到指定窗口", WindowsSystemHandler.class),
    /** 模拟执行 Windows 系统的 cmd 命令 */
    WINDOWS_CMD("windowsCmd", "模拟执行 Windows 系统的 cmd 命令", WindowsSystemHandler.class),
    CMD_OPEN_EXCEL_FILE("cmdOpenExcelFile", "打开多个 Excel 文件", WindowsSystemHandler.class),

    /** Web 端清除操作 */
    WEB_CLEAR("webClear", "Web 端清除操作", ClearActionHandler.class),
    /** Web 端输入操作 */
    WEB_INPUT("webInput", "Web 端输入操作", InputActionHandler.class),
    /** Web 端弹出信息框 */
    WEB_ALERT("webAlert", "Web 端弹出信息框", JsExeActionHandler.class),

    /** 检查 Web 界面元素的文本值 */
    WEB_CHECK("webCheck", "检查 Web 界面元素的文本值", CheckActionHandler.class),
    /** 检查 Web 界面元素的属性值 */
    WEB_CHECK_ATTR_VAL("webCheckAttrVal", "检查 Web 界面元素的属性值", CheckActionHandler.class),
    /** 检查 Web 界面调用 JS 返回的值 */
    WEB_CHECK_EXE_JS("webCheckExeJs", "检查 Web 界面调用 JS 返回的值", CheckActionHandler.class),

    /** 强制等待 */
    WAIT_FORCED("waitForced", "强制等待", WaitActionHandler.class),
    /** Web 端隐式等待 */
    WEB_WAIT_IMPLICIT("webWaitImplicit", "Web 端隐式等待", WaitActionHandler.class),

    /** Web 端点击操作 */
    WEB_CLICK("webClick", "Web 端点击操作", ClickActionHandler.class),
    /** Web 端滚动到元素位置操作 */
    SCROLL_ELEMENT("scrollElement", "Web 端滚动到元素位置操作", ClickActionHandler.class),
    /** Web 端切换 iframe 控件操作 */
    SWITCH_IFRAME("switchIframe", "Web 端切换 iframe 控件操作", ClickActionHandler.class),
    /** Web 端退出 iframe 控件操作 */
    QUIT_IFRAME("quitIframe", "Web 端退出 iframe 控件操作", ClickActionHandler.class),
    /** Web 端点击浏览器弹出窗的确定（true）/取消（false）键 */
    CLICK_ALERT_BTN("clickAlertBtn", "Web 端点击浏览器弹出窗的确定（true）/取消（false）键", ClickActionHandler.class),
    /** Web 端处理 prompt 弹窗的文本输入 */
    CLICK_PROMPT_INPUT("clickPromptInput", "Web 端处理 prompt 弹窗的文本输入", ClickActionHandler.class),

    /** 写 Excel */
    WRITE_EXCEL("writeExcel", "写 Excel", ExcelActionHandler.class),
    /** 读 Excel */
    READ_EXCEL("readExcel", "读 Excel", ExcelActionHandler.class);

    /**
     * key
     * 要调用动作处理器的方法名
     **/
    private String key;
    /** 描述 */
    private String desc;
    /** 动作处理器 */
    private Class<?> handler;

    /** 存放所有枚举值，方便获取 */
    private static Map<String, StepAction> actionMap;

    /**
     * 初始化枚举值 map
     *
     * @author Eugenema
     * @date 2023/3/11 12:49
     *
     **/
    static {
        actionMap = Arrays.stream(StepAction.values()).collect(Collectors.toMap(StepAction::getKey, StepAction -> StepAction));
    }

    StepAction(String key, String desc, Class<?> handler) {
        this.key = key;
        this.desc = desc;
        this.handler = handler;
    }

    public String getKey() {
        return key;
    }

    public String getDesc() {
        return desc;
    }

    public Class<?> getHandler() {
        return handler;
    }

    /**
     * 通过 key 值获取枚举值
     *
     * @author Eugenema
     * @date 2023/3/11 12:52
     *
     * @param name key 值
     *
     * @return 枚举
     **/
    public static StepAction getAction(String name) {
        StepAction stepAction = actionMap.get(name);
        if (stepAction == null) {
            throw new RuntimeException(String.format("【%s】未找到对应处理器，请检查脚本 xml 配置文件", name));
        }
        return actionMap.get(name);
    }
}
